/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */// HttpLog.h should generally be included first#include"HttpLog.h"#include"nsHttpActivityDistributor.h"#include"nsCOMPtr.h"#include"nsAutoPtr.h"#include"nsThreadUtils.h"namespacemozilla{namespacenet{typedefnsMainThreadPtrHolder<nsIHttpActivityObserver>ObserverHolder;typedefnsMainThreadPtrHandle<nsIHttpActivityObserver>ObserverHandle;typedefnsTArray<ObserverHandle>ObserverArray;classnsHttpActivityEvent:publicRunnable{public:nsHttpActivityEvent(nsISupports*aHttpChannel,uint32_taActivityType,uint32_taActivitySubtype,PRTimeaTimestamp,uint64_taExtraSizeData,constnsACString&aExtraStringData,ObserverArray*aObservers):Runnable("net::nsHttpActivityEvent"),mHttpChannel(aHttpChannel),mActivityType(aActivityType),mActivitySubtype(aActivitySubtype),mTimestamp(aTimestamp),mExtraSizeData(aExtraSizeData),mExtraStringData(aExtraStringData),mObservers(*aObservers){}NS_IMETHODRun()override{for(size_ti=0;i<mObservers.Length();i++){Unused<<mObservers[i]->ObserveActivity(mHttpChannel,mActivityType,mActivitySubtype,mTimestamp,mExtraSizeData,mExtraStringData);}returnNS_OK;}private:virtual~nsHttpActivityEvent(){}nsCOMPtr<nsISupports>mHttpChannel;uint32_tmActivityType;uint32_tmActivitySubtype;PRTimemTimestamp;uint64_tmExtraSizeData;nsCStringmExtraStringData;ObserverArraymObservers;};NS_IMPL_ISUPPORTS(nsHttpActivityDistributor,nsIHttpActivityDistributor,nsIHttpActivityObserver)nsHttpActivityDistributor::nsHttpActivityDistributor():mLock("nsHttpActivityDistributor.mLock"){}nsHttpActivityDistributor::~nsHttpActivityDistributor(){}NS_IMETHODIMPnsHttpActivityDistributor::ObserveActivity(nsISupports*aHttpChannel,uint32_taActivityType,uint32_taActivitySubtype,PRTimeaTimestamp,uint64_taExtraSizeData,constnsACString&aExtraStringData){nsCOMPtr<nsIRunnable>event;{MutexAutoLocklock(mLock);if(!mObservers.Length())returnNS_OK;event=newnsHttpActivityEvent(aHttpChannel,aActivityType,aActivitySubtype,aTimestamp,aExtraSizeData,aExtraStringData,&mObservers);}NS_ENSURE_TRUE(event,NS_ERROR_OUT_OF_MEMORY);returnNS_DispatchToMainThread(event);}NS_IMETHODIMPnsHttpActivityDistributor::GetIsActive(bool*isActive){NS_ENSURE_ARG_POINTER(isActive);MutexAutoLocklock(mLock);*isActive=!!mObservers.Length();returnNS_OK;}NS_IMETHODIMPnsHttpActivityDistributor::AddObserver(nsIHttpActivityObserver*aObserver){MutexAutoLocklock(mLock);ObserverHandleobserver(newObserverHolder("nsIHttpActivityObserver",aObserver));if(!mObservers.AppendElement(observer))returnNS_ERROR_OUT_OF_MEMORY;returnNS_OK;}NS_IMETHODIMPnsHttpActivityDistributor::RemoveObserver(nsIHttpActivityObserver*aObserver){MutexAutoLocklock(mLock);ObserverHandleobserver(newObserverHolder("nsIHttpActivityObserver",aObserver));if(!mObservers.RemoveElement(observer))returnNS_ERROR_FAILURE;returnNS_OK;}}// namespace net}// namespace mozilla